home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / Language / Compiler / sequence.c < prev    next >
C/C++ Source or Header  |  1990-08-16  |  2KB  |  86 lines

  1. /*
  2.  * @(#)sequence.c    1.3  6/29/87
  3.  */
  4. #include "nodes.h"
  5. #include "sequence.h"
  6. #include "assert.h"
  7.  
  8. NodePtr Sequence_Add(s, n)
  9. NodePtr *s, n;
  10. {
  11.     register NodePtr p = *s;
  12.     register int length;
  13.     if (p == NULL) {
  14.     (*s) = F_NewNode(T_SEQUENCE, 4);
  15.     p = (*s);
  16.     p->nChildren = 0;
  17.     } else if (p->nChildren >= p->maxChildren) {
  18.     length = p->maxChildren;
  19.     (*s) = F_NewNode(p->tag, 2 * length);
  20.     bcopy((char *)p, (char *)(*s), NodeSize(p));
  21.     (*s)->maxChildren = 2 * length;
  22.     free((char *)p);
  23.     p = (*s);
  24.     }
  25.     if (p->nChildren == 0 && (int) n > 0x200) p->lineNumber = n->lineNumber;
  26.     p->b.children[p->nChildren] = n;
  27.     p->nChildren++;
  28. }
  29.  
  30. NodePtr Sequence_AddFirst(s, n)
  31. NodePtr *s, n;
  32. {
  33.     register NodePtr p = *s;
  34.     register int length;
  35.     if (p == NULL) {
  36.     (*s) = F_NewNode(T_SEQUENCE, 4);
  37.     p = (*s);
  38.     p->nChildren = 0;
  39.     } else if (p->nChildren >= p->maxChildren) {
  40.     length = p->maxChildren;
  41.     (*s) = F_NewNode(p->tag, 2 * length);
  42.     bcopy((char *)p, (char *)(*s), NodeSize(p));
  43.     (*s)->maxChildren = 2 * length;
  44.     free((char *)p);
  45.     p = (*s);
  46.     }
  47.     assert(p->firstChild == 0);
  48.     for (length = p->nChildren - 1; length >= 0; length--)
  49.       p->b.children[length+1] = p->b.children[length];
  50.     p->nChildren++;
  51.     p->b.children[0] = n;
  52. }
  53.  
  54. void Sequence_Free(s)
  55. register NodePtr s;
  56. {
  57.     register int i;
  58.     for (i = s->firstChild; i < s->nChildren; i++) {
  59.     FreeNode(s->b.children[i]);
  60.     }
  61. }
  62.  
  63. void Sequence_RemoveSeparators(n)
  64. NodePtr n;
  65. {
  66.     register int i, j = 1;
  67.     assert(n->tag == T_SEQUENCE);
  68.     for (i = 2; i < n->nChildren; i+=2) {
  69.     n->b.children[j++] = n->b.children[i];
  70.     }
  71.     n->nChildren = j;
  72. }
  73.  
  74. NodePtr Sequence_Construct(n, first)
  75. int n;
  76. NodePtr first;
  77. {
  78.     register int i;
  79.     register NodePtr *a = &first, p;
  80.     p = F_NewNode(T_SEQUENCE, n);
  81.     p->nChildren = n;
  82.     for (i = 0; i < n; i++)
  83.     p->b.children[i] = a[i];
  84.     return(p);
  85. }
  86.